package cn.reineko.csmall.passport.service.impl;

import cn.reineko.csmall.passport.ex.ServiceCode;
import cn.reineko.csmall.passport.ex.ServiceException;
import cn.reineko.csmall.passport.mapper.AdminMapper;
import cn.reineko.csmall.passport.pojo.dto.AdminAddNewDTO;
import cn.reineko.csmall.passport.pojo.dto.AdminUpdateDTO;
import cn.reineko.csmall.passport.pojo.dto.AdminUpdatePasswordDTO;
import cn.reineko.csmall.passport.pojo.entity.Admin;
import cn.reineko.csmall.passport.pojo.vo.AdminListItemVO;
import cn.reineko.csmall.passport.pojo.vo.AdminStandardVO;
import cn.reineko.csmall.passport.service.IAdminService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class AdminServiceImpl implements IAdminService {

    @Autowired
    private AdminMapper adminMapper;

    @Override
    public void addNew(AdminAddNewDTO adminAddNewDTO) {
        log.trace("开始处理【添加管理员】的业务，参数: {}", adminAddNewDTO);

        // 判断用户名是否重复
        String username = adminAddNewDTO.getUsername(); // 取出用户输入的用户名
        log.debug("检查用户名【{}】是否被占用", username);
        // 调用adminMapper对象的countByUsername()方法，根据用户名统计管理员账号的数量，并判断是否大于0
        if (adminMapper.countByUsername(username) > 0) {
            // 是: 添加管理员失败 ，用户名已被占用，抛出ServiceException(ERR_CONFLICT_ADMIN_USERNAME)异常
            String message = "添加管理员失败，用户名【" + username + "】已被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT_ADMIN_USERNAME, message);
        }

        // 判断电话号码是否重复
        String phone = adminAddNewDTO.getPhone(); // 取出用户输入的电话号码
        log.debug("检查电话号码【{}】是否被占用", phone);
        // 调用adminMapper对象的countByPhone()方法，根据电话号码查询管理员账号的数量，并判断是否大于0
        if (adminMapper.countByPhone(phone) > 0) {
            // 是: 添加管理员失败，电话号码重复，抛出ServiceException(ERR_CONFLICT_ADMIN_PHONE)异常
            String  message = "添加管理员失败，电话号码【" + phone + "】已存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT_ADMIN_PHONE, message);
        }

        // 判断邮箱是否重复
        String email = adminAddNewDTO.getEmail(); // 取出用户输入的邮箱信息
        log.debug("检查邮箱【{}】是否被占用", email);
        // 调用adminMapper对象的countByEmail()方法，根据邮箱查询管理员账号的数量，并判断是否大于0
        if (adminMapper.countByEmail(email) > 0) {
            // 是: 添加管理员失败，邮箱重复，抛出ServiceException(ERR_CONFLICT_ADMIN_EMAIL)异常
            String  message = "添加管理员失败，邮箱【" + email + "】已存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT_ADMIN_EMAIL, message);
        }

        // 准备需要添加的对象
        Admin admin = new Admin();
        BeanUtils.copyProperties(adminAddNewDTO, admin); // 将参数的各个属性复制到Admin对象中
        // 补全Admin对象的属性：loginCount(值：0)
        admin.setLoginCount(0);
        // 密码加密: 取出Admin中的密码，将其加密后再存入到Admin对象中


        // 插入管理员数据
        log.debug("即将插入的管理员数据：{}", admin);
        // 调用adminMapper对象的insert()方法，插入管理员数据，并获取返回值(受影响的行数：执行成功的条数)
        int rows =adminMapper.insert(admin);
        // 判断返回值是否不等于1
        if (rows != 1) {
            // 是: 插入管理员数据失败，未知错误，抛出ServiceException（ERR_INSERT_ADMIN）
            String message = "添加管理员失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始执行【根据id删除一个管理员】的业务，参数：{}", id);

        // 查询管理员的数据是否存在
        log.debug("查看需要删除的数据是否存在");
        // 调用adminMapper对象的getStandardVO()方法，根据id查询对应的管理员信息，并判断是否为null
        if (adminMapper.getStandardVO(id) == null) {
            // 是：需要删除的信息不存在，抛出异常ServiceException(ERR_NOT_FOUND)
            String message = "删除管理员失败，尝试删除的数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 删除管理员
        log.debug("开始执行删除管理员【id={}】的操作", id);
        // 调用adminMapper对象的deleteById()方法，删除对应id的管理员信息，并返回成功行数
        int rows = adminMapper.deleteById(id);
        // 判断返回值是否不等于1
        if (rows != 1) {
            // 是：未知异常，抛出ServiceException(ERR_DELETE)异常
            String message = "删除管理员失败，服务器繁忙，请稍后重试";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public void setEnable(Long id) {
        log.trace("开始执行【启用管理员账号】的业务方法，参数：{}", id);

        // 判断需要启用的管理员是否存在
        log.debug("判断需启用的管理员数据是否存在");
        // 调用adminMapper对象的getStandardVO()方法，并返回对象结果
        AdminStandardVO adminStandardVO = adminMapper.getStandardVO(id);
        // 判断返回结果是否为null
        if (adminStandardVO == null) {
            // 是：启用失败，启用数据不存在，抛出ServiceException()异常
            String message = "启用管理员账号失败，启用数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 判断管理员账号是否为启用状态
        if (adminStandardVO.getEnable() == 1) {
            // 是：启用失败，管理员账号已经启用
            String message = "启用失败，管理员账号已启用";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 准备启用管理员账号的数据
        Admin admin = new Admin();
        admin.setId(id); // 设置需要启用的管理员的id值
        admin.setEnable(1); // 设置管理员状态为启用状态（enable=1）

        // 调用adminMapper对象的updateById()方法，启用此管理员账号，并返回执行成功的条数
        int rows = adminMapper.updateById(admin);
        // 判断执行成功的条数是否为1
        if (rows != 1) {
            // 是：未知异常，抛出ServiceException(ERR_UPDATE)异常
            String message = "启用管理员失败，服务器繁忙，请稍后重试";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public void setDisable(Long id) {
        log.debug("开始执行【禁用管理员账号】的业务方法，参数：{}", id);

        // 判断需要禁用的管理员是否存在
        log.debug("判断需禁用的管理员数据是否存在");
        // 调用adminMapper对象的getStandardVO()方法，并返回对象结果
        AdminStandardVO adminStandardVO = adminMapper.getStandardVO(id);
        // 判断返回结果是否为null
        if (adminStandardVO == null) {
            // 是：禁用失败，禁用数据不存在，抛出ServiceException()异常
            String message = "禁用管理员账号失败，禁用数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 判断管理员账号是否为禁用状态
        if (adminStandardVO.getEnable() == 0) {
            // 是：禁用失败，管理员账号已经禁用
            String message = "禁用失败，管理员账号已禁用";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 准备禁用管理员账号的数据
        Admin admin = new Admin();
        admin.setId(id); // 设置需要禁用的管理员的id值
        admin.setEnable(0); // 设置管理员状态为禁用状态（enable=0）

        // 调用adminMapper对象的updateById()方法，禁用此管理员账号，并返回执行成功的条数
        int rows = adminMapper.updateById(admin);
        // 判断执行成功的条数是否为1
        if (rows != 1) {
            // 是：未知异常，抛出ServiceException(ERR_UPDATE)异常
            String message = "禁用管理员失败，服务器繁忙，请稍后重试";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }

    }

    @Override
    public void updatePasswordById(AdminUpdatePasswordDTO adminUpdatePasswordDTO) {
        // 根据id修改管理员的密码（此功能暂定为超级管理员修改管理员密码，不用做密码是否相等的判断）
        log.trace("开始执行【修改管理员密码】的业务方法");

        // 判断需修改密码的管理员否存在
        log.debug("判断需修改密码的管理员否存在");
        // 调用adminMapper对象的getStandardVO()方法，并返回对象结果
        AdminStandardVO adminStandardVO = adminMapper.getStandardVO(adminUpdatePasswordDTO.getId());
        // 判断返回结果是否为null
        if (adminStandardVO == null) {
            // 是：修改密码失败，数据不存在，抛出ServiceException()异常
            String message = "修改密码失败，数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 准备修改的数据
        Admin admin = new Admin();
        // 使用BeanUtils.copyProperties()方法，将属性值赋值给Admin对象
        BeanUtils.copyProperties(adminUpdatePasswordDTO, admin);
        // 取出Admin对象中的密码（password），加密后重新存入到Admin对象中
        admin.setPassword(admin.getPassword());

        log.debug("开始执行【修改密码】");
        // 调用AdminMapper对象的updateById()方法，进行密码的修改，并返回执行成功的条数
        int rows = adminMapper.updateById(admin);
        // 判断执行成功条数是否为1
        if (rows != 1){
            // 是：未知异常，抛出ServiceException(ERR_UPDATE)异常
            String message = "修改管理员密码失败，服务器繁忙，请稍后重试";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public void updateById(AdminUpdateDTO adminUpdateDTO) {
        log.trace("开始处理【修改管理员的基本信息】的业务方法");

        // 判断需修改基本信息的管理员否存在
        log.debug("判断需修改基本信息的管理员否存在");
        // 调用adminMapper对象的getStandardVO()方法，并返回对象结果
        AdminStandardVO adminStandardVO = adminMapper.getStandardVO(adminUpdateDTO.getId());
        // 判断返回结果是否为null
        if (adminStandardVO == null) {
            // 是：修改基本信息失败，数据不存在，抛出ServiceException()异常
            String message = "修改信息失败，数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 准备需要修改的管理员基本信息的数据
        Admin admin = new Admin();
        BeanUtils.copyProperties(adminUpdateDTO, admin); // 将用户输入的信息赋值给Admin对象

        // 调用AdminMapper对象的updateById()方法，执行修改管理员基本信息，并返回执行成功条数
        int rows = adminMapper.updateById(admin);
        // 判断执行成功条数是否为1
        if (rows != 1) {
            // 是：未知异常，抛出ServiceException(ERR_UPDATE)异常
            String message = "修改管理员基本信息失败，服务器繁忙，请稍后重试";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public List<AdminListItemVO> list() {
        log.trace("开始执行【查询所有管理员信息】的业务方法");
        // 调用adminMapper的list()方法，返回装有所有管理员信息的List集合
        return adminMapper.list();
    }
}
